/*
 * ProgramError.h
 *
 *  Created on: 28/03/2013
 *      Author: gonzalo
 */

#ifndef PROGRAMERROR_H_
#define PROGRAMERROR_H_

#include "CommonException.h"

class ProgramError: public CommonException {
public:
	ProgramError(const char *format, ...) throw ():CommonException(format) {
		_errno = errno;
		memset(msg_error, 0, LEN_BUFF_ERROR);

		va_list args;
		va_start(args, format);

		vsprintf(msg_error, format, args);

		sprintf(msg_error + strlen(msg_error), " [code %i]: ", _errno);

		const char *_m = _errno != 0 ? strerror(_errno) : 0;
		int count = strlen(msg_error);
		if (count < LEN_BUFF_ERROR) {
			if (_m) {
				strncpy(msg_error + count, _m, LEN_BUFF_ERROR - count);
			} else {
				strncpy(msg_error + count, "Unknow.", LEN_BUFF_ERROR - count);
			}

			msg_error[LEN_BUFF_ERROR - 1] = 0; //guard
			count = strlen(msg_error);
			msg_error[count] = '\n';
		}
		msg_error[LEN_BUFF_ERROR - 1] = 0; //guard
		va_end(args);
	}
	virtual ~ProgramError() throw (){
	}

};

#endif /* PROGRAMERROR_H_ */
